package sunlight.session;

import java.io.Serializable;
import java.util.HashMap;

/**
 * Obiectul acestei clase, folosit cu referinta statica simuleaza o sesiune; 
 * De exemplu putem declara in clasa prinicipala o referinta statica catre un obiect de acest tip
 * si apoi il putem accesa din alte metode ale altor obiecte prin <pre>Application.Session</pre> , unde
 * am presupus ca  Application este clasa principala, iar Session este numele obiectului de acelas tip.
 * 
 * Exemplu de folosire:
 * <pre>
 * 		public static Session mySession;
 * 
 * 		mySession = new Session();
 * 		
 * 		mySession.setAttribute("username", "viorel");
 * 		
 * 		String username = mySession.getAttribute("username").toString();
 * </pre> 
 * 
 * @author Adrian #350;ilimon
 * @version 1.0
 */

public class Session implements Serializable{

	/**
	 * id-ul versiunii curenta
	 */
	private static final long serialVersionUID = 8181264661604194586L;
	
	public String  					id;
	public HashMap<String, Object> 	Attributes;
	
	private Object 	User;
	
	/**
	 * Constructor explicit, ofera posibilitatea de a asigna un id obiectului sesiune curent
	 * 
	 * @param id id-ul sesiunii
	 */
	public Session(String id){
		this.id 		= id;
		this.Attributes = new HashMap<String, Object>();
	}
	
	/**
	 * Constructor explicit, creeaza un nou obiect de tip sesiune
	 */
	public Session(){
		this.Attributes = new HashMap<String, Object>();
	}
	
	
	/**
	 * metoda asociaza un obiect de tip User la sesiune; 
	 * 
	 * TODO ~ User trebuie sa fie schimbat la Object, pentru a permita adaugarea oricarui tip
	 * de obiect preferat de programator;
	 * 
	 * @param u Obiectul de va atribuit;
	 */
	public void set_user(Object user){
		this.User = user;
	}
	
	/**
	 * returneaza obiectul asociat campului User al obiectului Sesiune;
	 * 
	 * @return User obiectul asociat obiectului sesiune
	 */
	public Object getUser(){
		return this.User;
	}
	
	/**
	 * sticheaza in lista de atribute ale sesiunii, cu cheia <pre>key</pre> Obiectul oferit
	 * ca valoare <pre>value</pre>;
	 * Daca exista deja un obiect cu aceeasi cheie, acesta va fi suprascris;
	 * Exemplu:
	 * <pre>
	 * 		mySession.setAttribute("id_utilizator", 23);
	 * </pre>
	 * 
	 * @param key 	cheia de identificara a atributului
	 * @param value	valoarea atributului
	 */
	public void setAttribute(String key, Object value){
		this.Attributes.put(key, value);
	}
	
	/**
	 * returneaza obiectul stocat cu cheia <pre>key</pre>
	 * Exemplu:
	 * <pre>
	 * 		String idUtilizator = mySession.getAttribute("id_utilizator").toString();
	 * </pre>
	 * 
	 * @param key cheia asociata obiectului
	 * @return	  obiectul asociat cu cheia
	 */
	public Object getAttribute(String key){
		return this.Attributes.get(key);
	}
	
	/**
	 * sterge dintre atribute, abiectul asociat cheii;
	 * Exemplu:
	 * <pre>
	 * 		mySession.removeAttribute("id_utilizator");
	 * </pre>
	 * 
	 * @param key
	 */
	public void removeAttribute(String key){
		this.Attributes.remove(key);
	}
	
	/**
	 * sterge toate atributele si obiectele asociate sesiunii;
	 */
	public void autoClean(){
		if(this.User != null){
			this.User = null;
		}
		
		this.Attributes.clear();
		
		if(this.id != null){
			this.id = null;
		}
	}
	
	/**
	 * finalizeaza obiectul sesiune;
	 * orice referinta catre atributele sau membri asociati va fi pierduta
	 * 
	 * @throws SessionDestroyException exceptie ce indica imposibilitatea inchiderii sesiunii
	 */
	public void destroy() throws SessionDestroyException{
		try {
			this.finalize();
		} catch (Throwable e) {
			throw new SessionDestroyException(e.toString());
		}
	}
	
}
